home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 26
/
AACD 26.iso
/
AACD
/
Programming
/
AllPlaton
/
Unsorted
/
AMOS-Datenbank.AMOS
/
AMOS-Datenbank.amosSourceCode
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
AMOS Source Code
|
1993-01-21
|
37.8 KB
|
1,328 lines
' **********************************
' * *
' * AMOS-Datenbank V1.0 *
' * von Christopher Hodges *
' * *
' **********************************
Set Buffer 300
Dim B(60,4)
Gosub INIT1
Dim DAT$(MXENT,MXROW-1),RTX$(MXROW-1),RD(MXROW-1)
Global TEX$,EMP$,AUTORET,RET,MO,B()
Gosub INIT2
ALERT["Musik anschalten?","Jaaa!","Bitte nicht!",""]
If Param=0 Then Track Loop On : Track Play 3
EDI=0 : USERBOX=0
Repeat
ALERT["Wollen Sie eine Bank laden?","Sicher doch!","Lieber eine neue anfangen!",""]
P=Param
If P=1 Then F$=" " : Gosub NEUEBANK : P=2
If P=0 Then Gosub LADEN
Until F$<>""
Gosub ROWUPDAT
Do
B=0 : M=Mouse Key : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse) : AC=Asc(Inkey$)
Multi Wait
If M Then Gosub CHECKBUT
If B=1 Then Gosub LADEN : Erase 16
If B=2 Then Gosub SPEICHERN
If B=3 Then Gosub LOESCHEN
If B=4 Then Gosub NEUEBANK
If B=5 Then Gosub VERSCHLUESSELN
If B=6 Then Gosub DATEILOESCHEN
If B=7 Then Gosub QUIT
If(B=8 or AC=30) and ROWOF>0 Then Dec ROWOF : Gosub ROWUPDAT
If(B=9 or AC=31) and ROWOF<ROWS-12 Then Inc ROWOF : Gosub ROWUPDAT
If B=10 or AC=28 Then Add ENT,1,1 To ENTRIES : Gosub UPDAENTRY
If B=11 or AC=29 Then Add ENT,-1,1 To ENTRIES : Gosub UPDAENTRY
If B=12 Then Gosub EINTRAGEINFUEGEN
If B=13 Then Gosub EINTRAGLOESCHEN
If B=14 Then Gosub EINTRAGSUCHEN
If B=15 Then Gosub ALPHABETSORT
If B=16 Then Gosub SATZDATEN
If B=17 Then Gosub EINTRAGDRUCKEN
If B=18 Then Gosub EINTRAGSICHERN
If B=19 Then Gosub SERIENBRIEFLADEN
If B=20 Then Gosub SERIENBRIEFSICHERN
If B=21 Then Gosub SERIENBRIEFZEIGEN
If B=22 Then Gosub SERIENBRIEFDRUCKEN
If B>29
ROW=B-30+ROWOF
Repeat
TEX$=DAT$(ENT,ROW)
EINGABE[132,57+(ROW-ROWOF)*12,40,RD(ROW),0]
If DAT$(ENT,ROW)<>TEX$ : EDI=1 : End If
DAT$(ENT,ROW)=TEX$
Add ROW,RET,0 To ROWS-1
If ROW-ROWOF>11 : ROWOF=ROW-11 : Gosub ROWUPDAT : End If
If ROW-ROWOF<0 : ROWOF=ROW : Gosub ROWUPDAT : End If
Until RET=0
End If
Loop
End
SERIENBRIEFDRUCKEN:
If BRIEF=0 Then ALERT["Es wurde noch kein Serienbrief geladen!","Hoppla!","",""] : Return
ALERT["Wollen Sie nur diesen Eintrag ausdrucken?","Yep!","Nein, mehrere!","Nichts ausdrucken!"]
P=Param
If P=2 Then Return
SD=ENT : ED=ENT
If P=1 Then Gosub HOLANFANGUNDENDE
P=0 : PRT=1
ALERT["Formfeed (Seitenvorschub) nach einem Brief?","Ja!","Nein!",""]
If Param Then FEED=0 Else FEED=1
SETUP["Drucke Serienbrief..."]
Open Out 1,"PRT:"
For A=SD To ED
SETMESS["Drucke Eintrag"+Str$(A)+" bis"+Str$(ED)+"..."]
Gosub MAKELETTER
If FEED Then Print #1,Chr$(12); Else Print #1,
Next
Close 1
SHUTUP
Return
SERIENBRIEFSICHERN:
If BRIEF=0 Then ALERT["Es wurde noch kein Serienbrief geladen!","Hoppla!","",""] : Return
ALERT["Wollen Sie nur diesen Eintrag einf�gen?","Yep!","Nein, mehrere!","Nichts sichern!"]
P=Param
If P=2 Then Return
SD=ENT : ED=ENT
If P=1 Then Gosub HOLANFANGUNDENDE
F$=Fsel$("","","Eintrag speichern","")
If F$="" Then ALERT["Abgebrochen!","Schade!","",""] : Return
SETUP["Sichere Serienbrief..."]
For A=SD To ED
If SD-ED=0 Then C$=F$ Else C$=Str$(A)-" " : C$=F$+C$
SETMESS["Sichere Brief "+Right$(C$,30)+"..."]
P=0
If Exist(C$) Then ALERT["Datei existiert schon! Was nun?","�berschreiben!","�berspringen","Abbruch"] : P=Param
If P=2 Then ALERT["Abgebrochen!","Schade!","",""] : SHUTUP : Return
PRT=2
If P=0 Then Open Out 1,C$ : Gosub MAKELETTER : Close 1
Next
SHUTUP
Return
HOLANFANGUNDENDE:
TEX$=Str$(ENT)-" "
INBOX["Legen Sie den Anfangseintrag fest:","Ok!","Abbruch!",5,1,1,ENTRIES]
If Param Then Pop : Return
SD=Val(TEX$)
TEX$=""
INBOX["Geben Sie den letzten Eintrag ein:","Ok!","Abbruch!",5,1,1,ENTRIES]
If Param Then Pop : Return
ED=Val(TEX$)
If ED<SD
ALERT["Ich habe die beiden Wert vertauscht!","Gut!","",""]
Swap SD,ED
End If
Return
SERIENBRIEFZEIGEN:
If BRIEF=0 Then ALERT["Es wurde noch kein Serienbrief geladen!","Hoppla!","",""] : Return
Screen Open 1,640,200,2,$8000
Curs Off : Palette 0,$FFF
For A=200 To 0 Step -8
Screen Display 1,128,A+50,320,200-A
Wait Vbl
Next
A=ENT : PRT=0
Gosub MAKELETTER
Locate 0,24 : Centre "Bitte die linke Maustaste dr�cken."
While Mouse Key : Wend
Repeat : Until Mouse Key
Cline
For A=0 To 192 Step 8
Screen Display 1,128,A+50,320,200-A
Wait Vbl
Next
Screen Close 1
Return
MAKELETTER:
A$="" : B=0 : FIL=0 : Y=0
ST=Start(15) : AD=ST
Repeat
P=Peek(AD) : Inc AD
If PRT=0
If P=10 or P=13 : Print A$ : A$="" : P=0 : Inc Y : End If
If Y>22
Locate 0,24 : Centre "Bitte die linke Maustaste dr�cken, um fortzufahren."
While Mouse Key : Wend
Repeat : Until Mouse Key
Cls : Y=0
End If
End If
If PRT
If P=10 or P=13 : Print #1,A$ : A$="" : P=0 : End If
End If
If P=94 Then B=1-B : P=0 : If B=0 Then Gosub INSERT : IN=0 : FIL=0
If B=1 and P>64 and P<91 Then Gosub INSERT : IN=0 : FIL=0
If B=1 and P=70 Then FIL=1
If B=1 and P>47 and P<59 Then IN=IN*10+(P-48)
If P and B=0 Then A$=A$+Chr$(P)
Until AD>ST+BRIEF-1
Return
INSERT:
If FIL=0 or IN=0 Then Return
If IN>ROWS Then Boom : Return
A$=A$+DAT$(A,IN-1)
Return
SERIENBRIEFLADEN:
F$=Fsel$("","","Serienbrief laden","")
If F$="" Then ALERT["Abgebrochen!","Schade!","",""] : Return
If Exist(F$)=0 Then ALERT["Hey, Du, die Datei existiert ja gar nicht!","Hoppla!","",""] : F$="" : Return
SETUP["Lade Serienbrief..."]
Open In 1,F$ : L=Lof(1) : Close 1
Erase 15 : Reserve As Work 15,L
Bload F$,Start(15)
SHUTUP
BRIEF=L
Return
ALPHABETSORT:
ALERT["Sind Sie sich sicher, da� Sie sortieren wollen?","Ja, sortieren!","Nein!",""]
If Param Then Return
Limit Mouse X Hard(0),Y Hard(38) To X Hard(479),Y Hard(199)
TX["NACH WELCHER ZEILE SOLL ICH SORTIEREN?",2,40]
Repeat
B=0 : M=Mouse Key : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
Multi Wait
If M Then Gosub CHECKBUT
Until B>29
ROW=B-30+ROWOF
Limit Mouse 128,50 To 487,249
Gosub ROWUPDAT
SETUP["Sortiere..."]
For AA=1 To ENTRIES
SETMESS["Durchgang"+Str$(AA)+"..."]
For A=1 To ENTRIES
If Upper$(DAT$(A,ROW))>Upper$(DAT$(AA,ROW)) and(DAT$(AA,ROW)<>"")
For B=0 To ROWS-1
Swap DAT$(A,B),DAT$(AA,B)
Next
End If
Next
Next
SHUTUP
B=0 : Gosub ROWUPDAT
Return
EINTRAGDRUCKEN:
D$="drucken" : PRT=1
D2$="drucke"
Gosub EINTRAGBERECHNEN
Return
EINTRAGSICHERN:
D$="sichern" : PRT=0
D2$="sichere"
Gosub EINTRAGBERECHNEN
Return
EINTRAGBERECHNEN:
ALERT["Wollen Sie nur diesen Eintrag "+D$+"?","Yep!","Nein, mehrere!","Nichts "+D$+"!"]
P=Param
If P=2 Then Return
SD=ENT : ED=ENT
If P=1 Then Gosub HOLANFANGUNDENDE
ALERT["Wollen Sie die Satzdaten mit"+D$+"?","Sicherlich","Nope!",""]
If Param=0 Then SAT=1 Else SAT=0
C=0
For B=0 To ROWS-1
C=Max(Len(RTX$(B)),C)
Next
D=0
For A=1 To ENTRIES
For B=0 To ROWS-1
D=Max(Len(DAT$(A,B)),D)
Next
Next
SETUP[Upper$(Left$(D2$,1))+Mid$(D2$,2)+" Eintrag..."]
If SD-ED=0
If PRT=0
Gosub GEFILE
Open Out 1,F$
Else
Open Out 1,"PRT:"
End If
A=SD : Gosub SIMPLEPRINT
Close 1
Else
Gosub MULTIPRINT
End If
SHUTUP
B=0
Return
MULTIPRINT:
ALERT["Wollen Sie die Eintr�ge auch nebeneinander "+D$+"?","Wenn's geht?","Rein untereinander!",""]
If Param=0
Gosub PARALLELDRUCK
Else
If PRT=0
Gosub GEFILE
Open Out 1,F$
Else
Open Out 1,"PRT:"
End If
For A=SD To ED
Gosub SIMPLEPRINT
Next
Close 1
End If
Return
GEFILE:
F$=Fsel$("","","Eintrag speichern","")
If F$="" Then ALERT["Abgebrochen!","Schade!","",""] : Pop : Return
P=0
If Exist(F$) Then ALERT["Datei existiert schon! Was nun?","�berschreiben!","Nichts speichern",""] : P=Param
If P=1 Then ALERT["Abgebrochen!","Schade!","",""] : Pop : Return
Return
PARALLELDRUCK:
If PRT
TEX$=Str$(PRLEN)-" "
INBOX["Wie lang ist eine Zeile auf dem Drucker?","Ok!","",5,1,C*SAT+D+2,200]
PRLEN=Val(TEX$)
AZ=(PRLEN-C*SAT)/(D+2)
Else
AZ=(79-C*SAT)/(D+2)
End If
If AZ=1
ALERT["Leider pa�t nur ein Eintrag in eine Zeile!","Weiter!","Abbruch!",""]
If Param : Return : End If
If PRT=0
Gosub GEFILE
Open Out 1,F$
Else
Open Out 1,"PRT:"
End If
For A=SD To ED
Gosub SIMPLEPRINT
Next
Close 1
Return
End If
ALERT["Nebeneinander passen"+Str$(AZ)+" Eintr�ge hin!","Gut so!","Vergi�' es!",""]
If Param Then Return
If PRT=0
Gosub GEFILE
Open Out 1,F$
Else
Open Out 1,"PRT:"
End If
For A1=SD To ED Step AZ
SETMESS[Upper$(Left$(D2$,1))+Mid$(D2$,2)+" Eintrag"+Str$(A1)+" bis"+Str$(Min(A1+AZ-1,ED))]
For B=0 To ROWS-1
If SAT Then A$=RTX$(B)+Space$(C-Len(RTX$(B))) Else A$=""
For A=A1 To A1+AZ-1
If A>ED Then Exit
A$=A$+DAT$(A,B)+Space$(D-Len(DAT$(A,B)))+" "
Next
Print #1,A$
Next
Print #1,
Next
Close 1
Return
SIMPLEPRINT:
SETMESS[Upper$(Left$(D2$,1))+Mid$(D2$,2)+" Eintrag"+Str$(A)]
For B=0 To ROWS-1
If SAT Then A$=RTX$(B)+Space$(C-Len(RTX$(B))) Else A$=""
A$=A$+DAT$(A,B)
Print #1,A$
Next
Print #1,
Return
VERSCHLUESSELN:
ALERT["Wollen Sie das Passwort ein- oder ausschalten?","Einschalten","Ausschalten","Abbruch"]
P=Param
If P=2 Then Return
If P=1 Then PASS=0 : ALERT["Passwort ausgeschaltet!","Yeah!","",""] : Return
PASS=0
ALERT["Wollen Sie ein Passwort oder eine Passnummer?","Ein Passwort bitte","Zahlen sind mir lieber!",""]
P=Param
If P=0 Then Gosub WORDPASS Else Gosub NUMPASS
Return
WORDPASS:
PASSTYP=0
Repeat
TEX$=""
INBOX["Gut. Geben Sie nun das Passwort ein:","Fertig!","Abbruch!",60,2,0,0]
If(TEX$="") or(Param=1) Then ALERT["Passworteingabe abgebrochen!","Huch!","",""] : Return
PASS$=TEX$ : TEX$=""
INBOX["Zur Sicherheit geben Sie das Passwort nochmal ein:","Ok!","Abbruch!",60,2,0,0]
If(TEX$="") or(Param=1) Then ALERT["Passworteingabe abgebrochen!","Huch!","",""] : Return
If PASS$<>TEX$ Then ALERT["Das Passwort war falsch!","Oh nein!","",""] : Return
PASS=0
For A=1 To Len(PASS$)
Add PASS,Asc(Mid$(PASS$,A,1))*A
Next
PASS=PASS mod $10000
If PASS=0 Then ALERT["Bitte nehmen Sie ein anderes Passwort!","H��?","",""]
Until PASS
ALERT["Beim n�chsten Speichern wird kodiert!","Sehr gut!","",""]
Return
NUMPASS:
PASSTYP=1
TEX$=Str$(Rnd($FFFF)+1)-" "
INBOX["Gut. Geben Sie nun den Code ein:","Fertig!","Abbruch!",5,1,1,$FFFF]
If(TEX$="") or(Param=1) Then ALERT["Passworteingabe abgebrochen!","Huch!","",""] : Return
PASS$=TEX$ : TEX$=""
INBOX["Zur Sicherheit geben Sie den Code nochmal ein:","Ok!","Abbruch!",5,3,1,$FFFF]
If(TEX$="") or(Param=1) Then ALERT["Passworteingabe abgebrochen!","Huch!","",""] : Return
If PASS$<>TEX$ Then ALERT["Der Code war falsch!","Oh nein!","",""] : Return
PASS=Val(TEX$)
ALERT["Beim n�chsten Speichern wird kodiert!","Sehr gut!","",""]
Return
SATZDATEN:
ALERT["Sind Sie sich sicher? (evtl Datenverlust?)","Ja!","Nee!","Optimieren!"]
P=Param
If P=1 Then Return
If P=2 Then Gosub OPTIMIZE : Return
Gosub SATZDATENAENDERN
DUMMY=0 : DUMMY4=0
For B=0 To ROWS-1
D=RD(B)
For A=1 To ENTRIES
A$=DAT$(A,B) : B$=Left$(A$,D)
While Right$(A$,1)=" " : A$=Left$(A$,Len(A$)-1) : Wend
If Len(B$)<Len(A$) Then Inc DUMMY : Add DUMMY4,Len(A$)-Len(B$)
Next
Next
If DUMMY
ALERT["Sie verlieren in"+Str$(DUMMY)+" Zeilen insgesamt"+Str$(DUMMY4)+" Zeichen!","Optimieren","Macht nix!",""]
If Param=0
Gosub OPTIMIZE
Else
For B=0 To ROWS-1
For A=1 To ENTRIES
DAT$(A,B)=Left$(DAT$(A,B),RD(B))
Next
Next
End If
End If
EDI=1
Return
REDRAWROW:
Ink 2 : Bar 2,52 To 477,197
For A=0 To Min(ROWS-1,11)
B[130,55+A*12,454,65+A*12]
Next
Return
OPTIMIZE:
SETUP["Optimiere..."]
For B=0 To ROWS-1
D=2 : DUMMY=0
For A=1 To ENTRIES
A$=DAT$(A,B)
While Right$(A$,1)=" " : A$=Left$(A$,Len(A$)-1) : Wend
DAT$(A,B)=A$
D=Max(Len(A$),D)
Next
If D and 1 Then Inc D
Add DUMMY,RD(B)-D
RD(B)=D
Next
SHUTUP
If DUMMY=0 Then ALERT["Hat leider nichts gebracht!","Ach, wie schade!","",""] : Return
EDI=1
ALERT["Damit sparen Sie"+Str$(DUMMY*ENTRIES)+" Zeichen!","Yeah!","",""]
Return
DATEILOESCHEN:
F$=Fsel$("","","Datei l�schen","")
If F$="" Then ALERT["Abgebrochen","Gut so!","",""] : Return
ALERT["Wollen Sie "+Right$(F$,30)+" wirklich l�schen?","Nat�rlich","Um Himmelswillen nein!",""]
If Param=1 Then Return
If Exist(F$)=0 Then ALERT["Hey, Du, die Datei existiert ja gar nicht!","Hoppla!","",""] : Return
SETUP["L�sche Datei..."]
Kill F$
SHUTUP
Return
QUIT:
ALERT["Sind Sie wirklich sicher?","Tja, leider","Huch! War nicht so gemeint",""]
If Param=1 Then Return
P=0
If EDI Then ALERT["Bank noch nicht abgespeichert!","Weg damit!","Huch! Speichern","'Tschuldigung!"] : P=Param
If P=2 Then Return
If P=1
Gosub SPEICHERN
If F$=""
ALERT["Abbrechen, oder was?","Doch beenden!","Nee, vergi� es!",""]
If Param=1 : Return : End If
End If
End If
Fade 2 : Wait 32
Track Stop
Screen Close 0
End
EINTRAGSUCHEN:
DUMMY=ENT
P=1
If WEIT Then ALERT["Weitersuchen?","Nat�rlich!","Neue Parameter!","Abbruch!"] : P=Param
If P=2 Then Return
ENT=0
If P=0 Then Add DUMMY,1,1 To ENTRIES : Goto SKIP
WEIT=1
ALERT["Gro�buchstaben=Kleinbuchstaben?","JA!","nein!",""]
P=Param
If P=2 Then Return
If P Then UPC=0 Else UPC=1
Limit Mouse X Hard(0),Y Hard(38) To X Hard(479),Y Hard(199)
Gosub ROWUPDAT
TX["BITTE ALLE SUCHSTRINGS EINGEBEN",2,40]
SETB[45,320,40,477,50,"FERTIG!"]
USERBOX=1
Repeat
B=0 : M=Mouse Key : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
Multi Wait
If M Then Gosub CHECKBUT
If B>29 and B<43
ROW=B-30+ROWOF
Repeat
TEX$=DAT$(0,ROW)
EINGABE[132,57+(ROW-ROWOF)*12,40,RD(ROW),0]
DAT$(0,ROW)=TEX$
Add ROW,RET,0 To ROWS-1
If ROW-ROWOF>11 : ROWOF=ROW-11 : Gosub ROWUPDAT : End If
If ROW-ROWOF<0 : ROWOF=ROW : Gosub ROWUPDAT : End If
Until RET=0
End If
Until B=45
USERBOX=0
Limit Mouse 128,50 To 487,249
Ink 2 : Bar 2,40 To 477,50
SKIP:
SETUP["Suche Eintrag..."]
For A=DUMMY To ENTRIES
If(A mod 10)=0 Then SETMESS["Eintrag"+Str$(A)+"..."]
C=0
For B=0 To ROWS-1
If UPC Then A$=Upper$(DAT$(0,B)) : B$=Upper$(DAT$(A,B)) Else A$=DAT$(0,B) : B$=DAT$(A,B)
If A$=""
Inc C
Else
If B$<>""
If Instr(B$,A$)
Inc C
End If
End If
End If
Next
Exit If C=ROWS
Next
SHUTUP
If A=ENTRIES+1 Then ALERT["Nichts gefunden!","Mist!","",""] Else DUMMY=A
ENT=DUMMY : ROW=0 : ROWOF=0 : B=0
Gosub ROWUPDAT
Return
EINTRAGEINFUEGEN:
If ENTRIES=MXENT Then ALERT["Kein Platz mehr!","Mist!","",""] : Return
ALERT["Wo wollen Sie den Eintrag einf�gen? Zwischen","vorherigen und diesem","diesem und n�chsten",""]
P=Param
If P=0
For A=ENTRIES To ENT Step -1
For B=0 To ROWS-1
DAT$(A+1,B)=DAT$(A,B)
Next
Next
For B=0 To ROWS-1
DAT$(ENT,B)=""
Next
Else
For A=ENTRIES To ENT+1 Step -1
For B=0 To ROWS-1
DAT$(A+1,B)=DAT$(A,B)
Next
Next
Inc ENT
For B=0 To ROWS-1
DAT$(ENT,B)=""
Next
End If
B=0
Inc ENTRIES
Gosub UPDAENTRY
Return
EINTRAGLOESCHEN:
ALERT["Wollen Sie den ganzen Eintrag oder den Inhalt l�schen?","Ganzen Eintrag","Nur den Inhalt","Keine Ahnung!"]
P=Param
If P=2 Then Return
If P=1
For A=0 To ROWS-1
DAT$(ENT,A)=""
Next
Gosub UPDAENTRY
Return
End If
If ENTRIES=1 Then ALERT["Tut mir leid, ein Eintrag mu� dableiben!","Ach so!","",""] : Return
If ENT=ENTRIES Then Dec ENT : Dec ENTRIES : Gosub UPDAENTRY : Return
For A=ENT+1 To ENTRIES
For B=0 To ROWS-1
DAT$(A-1,B)=DAT$(A,B)
Next
Next
B=0 : Dec ENTRIES
ENT=Max(ENT-1,1)
Gosub UPDAENTRY
Return
NEUEBANK:
P=0
If EDI Then ALERT["Bank noch nicht abgespeichert!","Weg damit!","Huch! Speichern","'Tschuldigung!"] : P=Param
If P=2 Then F$="" : Return
If P=1
Gosub SPEICHERN
If F$=""
ALERT["Abbrechen, oder was?","Doch neue Bank","Nee, vergi� es!",""]
If Param=1 : Return : End If
End If
End If
TEX$=Str$(ENTRIES)-" "
INBOX["Wieviele Eintr�ge?","OK!","Abbruch!",5,1,1,MXENT]
If Param=1 Then F$="" : Return
ENTRIES=Val(TEX$)
ENT=1 : ROW=0 : ROWOF=0
SETUP["L�sche Datenbank..."]
For A=0 To MXROW-1
RTX$(A)=""
Next
For B=0 To MXROW-1
RD(B)=40
Next
For A=1 To ENTRIES
If(A mod 10)=0 Then SETMESS["Eintrag"+Str$(A)]
For B=0 To MXROW-1
DAT$(A,B)=""
Next
Next
SHUTUP
Gosub SATZDATENAENDERN
EDI=0
Return
SATZDATENAENDERN:
Limit Mouse X Hard(0),Y Hard(38) To X Hard(479),Y Hard(199)
DUMMY2=ENT
B[0,38,479,199]
TEX$=Str$(ROWS)-" "
DUMMY=ROWS
INBOX["Wieviele Zeilen?","OK!","Abbruch!",5,1,2,MXROW]
If Param=0 Then ROWS=Val(TEX$)
If DUMMY<ROWS
For B=DUMMY To ROWS-1
RD(B)=40
Next
For A=1 To ENTRIES
For B=DUMMY To ROWS-1
DAT$(A,B)=""
Next
Next
End If
USERBOX=4+Min(ROWS,12)
Gosub REDRAW
For B=0 To ROWS-1
DAT$(0,B)=Str$(RD(B))-" "
Next
ENT=0 : Gosub ROWUPDAT
SETB[45,2,40,125,50,"EINF�GEN"]
SETB[46,127,40,250,50,"L�SCHEN"]
SETB[47,252,40,375,50,"AUSTAUSCHEN"]
SETB[48,377,40,477,50,"FERTIG!"]
Repeat
B=0 : M=Mouse Key : AC=Asc(Inkey$) : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
Multi Wait
If AC=30 and ROWOF>0 Then Dec ROWOF : Gosub ROWUPDAT
If AC=31 and ROWOF<ROWS-12 Then Inc ROWOF : Gosub ROWUPDAT
If M Then Gosub CHECKBUT
If B=45 Then Gosub ZEILEEINFUEGEN
If B=46 Then Gosub ZEILELOESCHEN
If B=47 Then Gosub ZEILESWAP
If B>48
ROW=B-49+ROWOF
Repeat
TEX$=RTX$(ROW)
EINGABE[2,57+(ROW-ROWOF)*12,16,16,0]
RTX$(ROW)=TEX$
Add ROW,RET,0 To ROWS-1
If ROW-ROWOF>11 : ROWOF=ROW-11 : Gosub ROWUPDAT : End If
If ROW-ROWOF<0 : ROWOF=ROW : Gosub ROWUPDAT : End If
Until RET=0
End If
If B>29 and B<43
ROW=B-30+ROWOF
Repeat
TEX$=Str$(RD(ROW))-" "
EINGABE[132,57+(ROW-ROWOF)*12,10,3,1]
RD(ROW)=Min(Max(Val(TEX$),2),250)
If RD(ROW) and 1 : Inc RD(ROW) : End If
DAT$(ENT,ROW)=Str$(RD(ROW))-" "
Add ROW,RET,0 To ROWS-1
If ROW-ROWOF>11 : ROWOF=ROW-11 : Gosub ROWUPDAT : End If
If ROW-ROWOF<0 : ROWOF=ROW : Gosub ROWUPDAT : End If
Until RET=0
End If
Until B=48
For B=0 To ROWS-1
DAT$(0,B)=""
Next
USERBOX=0
Limit Mouse 128,50 To 487,249
Ink 2 : Bar 2,40 To 477,50
Bar 1,40 To 129,198
EDI=1 : ENT=DUMMY2 : ROW=0 : ROWOF=0 : B=0
Gosub ROWUPDAT
Return
ZEILEEINFUEGEN:
If ROWS=MXROW Then ALERT["Kein Platz mehr!","Mist!","",""] : Return
Ink 2 : Bar 2,40 To 477,50
TX["ZWISCHEN WELCHEN ZEILEN SOLL ICH EINF�GEN?",2,40]
USERBOX=0
Repeat
B=0 : M=Mouse Key : AC=Asc(Inkey$) : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
Multi Wait
If AC=30 and ROWOF>0 Then Dec ROWOF : Gosub ROWUPDAT
If AC=31 and ROWOF<ROWS-12 Then Inc ROWOF : Gosub ROWUPDAT
If M Then Gosub CHECKBUT
Until B>29
ROW=B-30+ROWOF
ALERT["Wo wollen Sie die Zeile einf�gen? Zwischen","vorheriger und dieser","dieser und n�chster",""]
P=Param
SETUP["F�ge Zeile ein..."]
If P=0
For A=0 To ENTRIES
If(A mod 10)=0 : SETMESS["Eintrag"+Str$(A)] : End If
For B=ROWS To ROW Step -1
DAT$(A,B+1)=DAT$(A,B)
Next
DAT$(A,ROW)=""
Next
For B=ROWS To ROW Step -1
RTX$(B+1)=RTX$(B)
RD(B+1)=RD(B)
Next
Else
For A=0 To ENTRIES
If(A mod 10)=0 : SETMESS["Eintrag"+Str$(A)] : End If
For B=ROWS To ROW+1 Step -1
DAT$(A,B+1)=DAT$(A,B)
Next
DAT$(A,ROW)=""
Next
For B=ROWS To ROW+1 Step -1
RTX$(B+1)=RTX$(B)
RD(B+1)=RD(B)
Next
Inc ROW
End If
SHUTUP
RTX$(ROW)="" : RD(ROW)=40
DAT$(0,ROW)=Str$(RD(ROW))-" "
B=0
Inc ROWS
Ink 2 : Bar 2,40 To 477,50
USERBOX=4+Min(ROWS,12)
Gosub REDRAW
Gosub ROWUPDAT
SETB[45,2,40,125,50,"EINF�GEN"]
SETB[46,127,40,250,50,"L�SCHEN"]
SETB[47,252,40,375,50,"AUSTAUSCHEN"]
SETB[48,377,40,477,50,"FERTIG!"]
Return
ZEILELOESCHEN:
If ROWS<3 Then ALERT["Tut mir leid, es m�ssen min. 2 Zeilen dableiben!","Ach so!","",""] : Return
ALERT["Sind Sie sicher?","Yep!","Oh, Entschuldigung!",""]
If Param=1 Then Return
Ink 2 : Bar 2,40 To 477,50
TX["WELCHE ZEILE SOLL ICH L�SCHEN?",2,40]
USERBOX=0
Repeat
B=0 : M=Mouse Key : AC=Asc(Inkey$) : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
Multi Wait
If AC=30 and ROWOF>0 Then Dec ROWOF : Gosub ROWUPDAT
If AC=31 and ROWOF<ROWS-12 Then Inc ROWOF : Gosub ROWUPDAT
If M Then Gosub CHECKBUT
Until B>29
ROW=B-30+ROWOF
For B=ROW To ROWS-2
RTX$(B)=RTX$(B+1)
RD(B)=RD(B+1)
Next
If ROW<>ROWS
SETUP["L�sche Zeile..."]
For A=0 To ENTRIES
If(A mod 10)=0 : SETMESS["Eintrag"+Str$(A)] : End If
For B=ROW To ROWS-2
DAT$(A,B)=DAT$(A,B+1)
Next
Next
SHUTUP
End If
B=0 : Dec ROWS
ROW=Max(ROW-1,0)
ROWOF=Max(ROWOF-1,0)
Ink 2 : Bar 2,40 To 477,50
USERBOX=4+Min(ROWS,12)
Gosub REDRAW : Gosub ROWUPDAT
SETB[45,2,40,125,50,"EINF�GEN"]
SETB[46,127,40,250,50,"L�SCHEN"]
SETB[47,252,40,375,50,"AUSTAUSCHEN"]
SETB[48,377,40,477,50,"FERTIG!"]
Return
ZEILESWAP:
ALERT["Sind Sie sicher?","Yep!","Oh, Entschuldigung!",""]
If Param=1 Then Return
Ink 2 : Bar 2,40 To 477,50
TX["WELCHE ZEILE SOLL ICH VERTAUSCHEN?",2,40]
USERBOX=0 : ROW=-1
Repeat
B=0 : M=Mouse Key : AC=Asc(Inkey$) : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
Multi Wait
If AC=30 and ROWOF>0 Then Dec ROWOF : Gosub ROWUPDAT
If AC=31 and ROWOF<ROWS-12 Then Inc ROWOF : Gosub ROWUPDAT
If M Then Gosub CHECKBUT
If ROW=-1 and B>29
ROW=B-30+ROWOF
TX["MIT WELCHER ZEILE VERTAUSCHEN? ",2,40]
B=0
End If
Until B>29 and ROW>-1
Add B,-30
If B<>ROW
SETUP["Vertausche Zeilen..."]
Swap RTX$(B),RTX$(ROW)
Swap RD(B),RD(ROW)
For A=0 To ENTRIES
If(A mod 10)=0 : SETMESS["Eintrag"+Str$(A)] : End If
Swap DAT$(A,B),DAT$(A,ROW)
Next
SHUTUP
End If
B=0
Ink 2 : Bar 2,40 To 477,50
USERBOX=4+Min(ROWS,12)
Gosub REDRAW : Gosub ROWUPDAT
SETB[45,2,40,125,50,"EINF�GEN"]
SETB[46,127,40,250,50,"L�SCHEN"]
SETB[47,252,40,375,50,"AUSTAUSCHEN"]
SETB[48,377,40,477,50,"FERTIG!"]
Return
REDRAW:
Ink 2 : Bar 2,52 To 477,197
For A=0 To Min(ROWS-1,11)
B[130,55+A*12,454,65+A*12]
SETB[A+49,1,55+A*12,129,65+A*12,""]
Next
Return
LOESCHEN:
P=0
If EDI Then ALERT["Bank noch nicht abgespeichert!","Weg damit!","Huch! Speichern","'Tschuldigung!"] : P=Param
If P=2 Then F$="" : Return
If P=1
Gosub SPEICHERN
If F$=""
ALERT["Abbrechen, oder was?","Doch l�schen","Nee, vergi� es!",""]
If Param=1 : Return : End If
End If
End If
For A=1 To ENTRIES
For B=0 To ROWS-1
DAT$(A,B)=""
Next
Next
EDI=0 : ENT=1 : ROW=0 : ROWOF=0 : B=0
Gosub ROWUPDAT
Return
LADEN:
P=0
If EDI Then ALERT["Bank noch nicht abgespeichert!","Trotzdem laden","Huch! Speichern","'Tschuldigung!"] : P=Param
If P=2 Then F$="" : Return
If P=1
Gosub SPEICHERN
If F$=""
ALERT["Abbrechen, oder was?","Doch laden","Nee, vergi� es!",""]
If Param=1 : Return : End If
End If
End If
F$=Fsel$("*.dat","Bank.dat","Datenbank laden","")
If F$="" Then ALERT["Abgebrochen!","Schade!","",""] : Return
If Exist(F$)=0 Then ALERT["Hey Du, die Datei existiert ja gar nicht!","Hoppla!","",""] : F$="" : Return
SETUP["Lade Datei..."]
SETMESS["Lese File..."]
Open In 1,F$ : L=Lof(1) : ID$=Input$(1,4) : LE$=Input$(1,4) : Close 1
LE=Leek(Varptr(LE$))
If(ID$<>"DBAS") and(ID$<>"PACK") Then ALERT["Das ist keine AMOS-Datenbank!","'Tschuldigung!","",""] : F$="" : SHUTUP : Return
Erase 16 : Reserve As Work 16,LE
ST=Start(16)
Bload F$,ST
If ID$="PACK"
SETMESS["Entpacke Datenbank..."]
B= Extension_5_00E4(ST+8,L-8)
If B+8<>LE
ALERT["Fehler beim Entpacken der Datei!("+Str$(B+8)+"<>"+Str$(LE)+")","Oh nein!","",""]
F$="" : SHUTUP : B=0 : Return
End If
End If
If Deek(ST+12)>MXENT Then ALERT["Bank zu gro� (zu viele Eintr�ge!)","Mist!","",""] : F$="" : SHUTUP : Return
If Deek(ST+14)>MXROW Then ALERT["Bank zu gro� (zu viele Zeilen!)","Mist!","",""] : F$="" : SHUTUP : Return
If Leek(ST+16+Deek(ST+14)*18)<>$44415441 Then ALERT["Datei ist fehlerhaft!","Sch....","",""] : F$="" : SHUTUP : Return
SETMESS["�bertrage Satzdaten..."]
ENTRIES=Deek(ST+12)
ROWS=Deek(ST+14)
For A=0 To ROWS-1
RD(A)=Deek(ST+16+A*18)
PULL[ST+18+A*18,16]
RTX$(A)=Param$
Next
AD=ST+20+ROWS*18
PASS=0
If Leek(ST+8)=$50524F57
TEX$=""
INBOX["Datei kodiert. Passwort eingeben:","Fertig!","",60,2,0,0]
PASS=0
For A=1 To Len(TEX$)
Add PASS,Asc(Mid$(TEX$,A,1))*A
Next
PASS=PASS mod $10000
End If
If Leek(ST+8)=$50524F4E
TEX$=""
INBOX["Datei kodiert. Code eingeben:","Fertig!","",5,3,1,$FFFF]
PASS=Val(TEX$)
End If
If PASS
SETMESS["Dekodiere Datenbank..."]
B=PASS : C=0
For A=AD To ST+LE-1 Step 2
Doke A,(Deek(A)-B) mod $10000
Add C,1,0 To 9 : If C=0 : Add B,1,1 To $FFFF : End If
Next
End If
SETMESS["�bertrage Daten..."]
For A=1 To ENTRIES
For B=0 To ROWS-1
PULL[AD,RD(B)]
DAT$(A,B)=Param$
Add AD,RD(B)
Next
Next
SHUTUP
Erase 16
Gosub REDRAWROW
B[0,38,479,199]
For A=0 To Min(ROWS-1,11)
B[130,55+A*12,134+320,65+A*12]
Next
EDI=0 : ENT=1 : ROWOF=0 : ROW=0 : B=0
Gosub ROWUPDAT
Return
SPEICHERN:
P=0
If EDI=0 Then ALERT["Die Bank wurde doch gar nicht wesentlich ver�ndert!","Was geht Dich das an?","Hast recht!",""] : P=Param
If P=1 Then ALERT["Abgebrochen!","Schade!","",""] : Return
F$=Fsel$("*.dat","Bank.dat","Datenbank speichern","")
If F$="" Then ALERT["Abgebrochen!","Schade!","",""] : Return
P=0
If Exist(F$) Then ALERT["Datei existiert schon! Was nun?","�berschreiben!","Backup machen","Nichts speichern"] : P=Param
If P=2 Then ALERT["Abgebrochen!","Schade!","",""] : F$="" : Return
SETUP["Speichere Datei..."]
If P=1
SETMESS["Erstelle Backup-Datei..."]
A$=F$-".dat"-".daT"-".dAt"-".dAT"-".Dat"-".DaT"-".DAt"-".DAT"
A$=A$+".bak"
If Exist(A$) : Kill A$ : End If
Rename F$ To A$
End If
LE=16+ROWS*18+4 : ED=0
For A=0 To ROWS-1
Add ED,ENTRIES*RD(A)
Next
Add LE,ED
Erase 16 : Reserve As Work 16,LE
SETMESS["Berechne Header..."]
ST=Start(16)
Loke ST,$44424153 : Rem "DBAS"=$44424153; "PACK"=$5041434B
Loke ST+4,LE
Loke ST+8,$4E4F524D : Rem "NORM"=$4E4F524D; "PROT"=$50524F54
Doke ST+12,ENTRIES
Doke ST+14,ROWS
For A=0 To ROWS-1
Doke ST+16+A*18,RD(A)
PUSH[RTX$(A),ST+18+A*18,16]
Next
Loke ST+16+ROWS*18,$44415441 : Rem "DATA"=$44415441
SETMESS["�bertrage Daten..."]
AD=ST+20+ROWS*18
For A=1 To ENTRIES
For B=0 To ROWS-1
GOT$=DAT$(A,B)
PUSH[DAT$(A,B),AD,RD(B)]
Add AD,RD(B)
Next
Next
If PASS
ALERT["Kodieren?","Sicher!","Nee!",""]
If Param=0
If PASSTYP=0 : Loke ST+8,$50524F57 Else Loke ST+8,$50524F4E : End If
B=PASS : C=0
SETMESS["Kodiere..."]
For A=ST+20+ROWS*18 To AD-1 Step 2
Doke A,(Deek(A)+B) mod $10000
Add C,1,0 To 9 : If C=0 : Add B,1,1 To $FFFF : End If
Next
End If
End If
SETMESS[""]
ALERT["Soll ich die Bank noch packen?","Schlecht w�r's nicht!","Hmm... Nein, lieber nicht!",""]
P=Param
If P=1 Then SETMESS["Speichere..."] : Bsave F$,ST To ST+LE : EDI=0 : Erase 16 : B=0 : SHUTUP : Return
Loke ST,$5041434B
ALERT["Welche Crunchrate?","Schnell","Mittel","Am besten"]
P=Param
If P=0 Then RATE=512
If P=1 Then RATE=1024
If P=2 Then RATE=4095
SETMESS["Packe..."]
B= Extension_5_00CE(ST+8,LE-8,1,RATE,2)
If B=0 Then ALERT["Crunching abgebrochen, nichts gespeichert!","Gut so!","",""] : F$="" : SHUTUP : Return
If B<0 Then ALERT["Gepackte Datei wird l�nger als ungepackt!","Sowas aber auch!","",""] : F$="" : SHUTUP : B=0 : Return
SETMESS["Speichere..."]
Bsave F$,ST To ST+B+8 : EDI=0 : Erase 16
SHUTUP
ALERT["Datei wurde auf"+Str$((B*100)/LE)+"% der urspr�nglichen L�nge verk�rzt!","Sehr gut!","Geht so!","Schlecht!"]
P=Param
If P=2 Then ALERT["Na h�r' mal, das sind immerhin"+Str$(LE-B)+" Bytes!","Entschuldige bitte!","Ach, vergi� es!",""]
B=0
Return
ROWUPDAT:
For A=0 To Min(11,ROWS-1)
Ink 1,2 : Text 2,63+A*12,RTX$(A+ROWOF)+Space$(16-Len(RTX$(A+ROWOF)))
Next
UPDAENTRY:
If ENT>0
Ink 2 : Bar 2,40 To 477,50
TX["EINTRAG"+Str$(ENT)+" VON"+Str$(ENTRIES)+" ",2,40]
End If
Ink 1,2
For A=0 To Min(ROWS-1,11)
TEX$=DAT$(ENT,A+ROWOF)
Text 132,63+A*12,Left$(TEX$,Min(Len(TEX$),40))+Space$(Max(0,40-Len(TEX$)))
Next
Return
INIT1:
Screen Open 0,640,200,4,$8000
Flash Off : Paper 0 : Pen 1 : Curs Off : Cls
Palette 0,0,0,0
Flash 21,"(F00,8)(C00,4)(800,4)(400,4)(000,8)(400,4)(800,4)(C00,4)"
Limit Mouse 128,50 To 487,249
EMP$="." : AUTORET=1 : PRLEN=80
ENT=1 : MXENT=500 : MXROW=50 : ROWS=10 : ENTRIES=10 : ROWOF=0 : ROW=0
Return
INIT2:
BT[0,0,639,10,"DIE AMOS-DATENBANK V1.1 VON CHRISTOPHER HODGES!"]
B[0,11,639,37]
B[0,38,479,199]
B[480,38,639,124]
B[480,125,639,199]
Restore DATS
For A=1 To 22
Read B(A,0),B(A,1),B(A,2),B(A,3),T$
BT[B(A,0),B(A,1),B(A,2),B(A,3),T$]
Next
For A=0 To MXROWS-1
RTX$(A)=""
RD(B)=40
Next
For A=0 To 11
B(A+30,0)=130 : B(A+30,1)=55+A*12
B(A+30,2)=454 : B(A+30,3)=65+A*12
Next
Ink 3 : A=1 : Gosub ARROWUP
Ink 1 : A=0 : Gosub ARROWUP
Ink 3 : A=1 : Gosub ARROWDOWN
Ink 1 : A=0 : Gosub ARROWDOWN
Fade 2,0,$FFF,$AAA,$444
Return
ARROWUP:
Bar 491+A,42+A To 492+A,78+A
Draw 484+A,60+A To 491+A,42+A : Draw 484+A,61+A To 491+A,43+A
Draw 500+A,60+A To 493+A,42+A : Draw 500+A,61+A To 493+A,43+A
Return
ARROWDOWN:
Bar 491+A,84+A To 492+A,120+A
Draw 484+A,102+A To 491+A,120+A : Draw 484+A,101+A To 491+A,119+A
Draw 500+A,102+A To 493+A,120+A : Draw 500+A,101+A To 493+A,119+A
Return
CHECKBUT:
B=0
If USERBOX
For A=45 To 44+USERBOX
If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) : B=A : Exit : End If
Next
End If
If B=0
For A=1 To 22
If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) : B=A : Exit : End If
Next
If ROWS
For A=30 To Min(29+ROWS,42)
If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) : B=A : Exit : End If
Next
End If
End If
If B=0 Then Return
P=0
Repeat
M=Mouse Key : X=(X Mouse-128)*2 : Y=Y Mouse-50 : A=0
If X>B(B,0) and Y>B(B,1) and X<B(B,2) and Y<B(B,3) Then A=1
If A=1 and P=0 Then P=1 : PRESS[B]
If A=0 and P=1 Then P=0 : REALISE[B]
Until M=0
If P=0 Then B=0 : Return
REALISE[B]
Return
Procedure EINGABE[TX,TY,WX,MC,NUMS]
Ink 1,2
TEXX=0 : TEXOF=0 : ALT$="x" : RET=0
Do
Multi Wait : I$=Inkey$ : AC=Asc(I$) : SC=Scancode : KS=Key Shift
If AC=13 and AUTORET Then RET=1
Exit If AC=13 or AC=27 or Mouse Key
If SC=76 Then RET=-1+KS*1000 : Exit
If SC=77 Then RET=1-KS*1000 : Exit
If(NUMS and 1) and AC>31 and(AC<48 or AC>57) Then AC=0
If AC>31 and Len(TEX$)<MC Then TEX$=Left$(TEX$,TEXX)+I$+Mid$(TEX$,TEXX+1) : Inc TEXX
If SC=65 and KS=0 and TEXX>0 Then TEX$=Left$(TEX$,TEXX-1)+Mid$(TEX$,TEXX+1) : Dec TEXX
If SC=70 and KS=0 and TEXX<Len(TEX$) Then TEX$=Left$(TEX$,TEXX)+Mid$(TEX$,TEXX+2)
If SC=65 and KS and TEXX>0 Then TEX$=Mid$(TEX$,TEXX+1) : TEXX=0
If SC=70 and KS and TEXX<Len(TEX$) Then TEX$=Left$(TEX$,TEXX) : TEXX=Len(TEX$)
If AC=29 and TEXX>0 Then Dec TEXX
If AC=28 and TEXX<Len(TEX$) Then Inc TEXX
If SC=79 and KS Then TEXX=0
If SC=78 and KS Then TEXX=Len(TEX$)
If TEXX-TEXOF>WX-1 Then TEXOF=TEXX-WX+1
If TEXX-TEXOF<0 Then TEXOF=Max(0,TEXX)
Sprite 2,128+(TX+TEXX*8-TEXOF*8)/2,50+TY,1 : Wait Vbl
If(ALT$<>TEX$) or(ALTOF<>TEXOF)
ALT$=TEX$ : ALTOF=TEXOF
If NUMS and 2
Text TX,TY+6,String$("*",Min(Len(TEX$)+TEXOF,WX))+String$(EMP$,Max(0,Min(WX,MC)-Len(TEX$)+TEXOF))
Else
Text TX,TY+6,Mid$(TEX$,TEXOF+1,Min(Len(TEX$)+TEXOF,WX))+String$(EMP$,Max(0,Min(WX,MC)-Len(TEX$)+TEXOF))
End If
End If
Loop
If NUMS and 1 Then TEX$=Str$(Val(TEX$))-" "
If NUMS and 2
Text TX,TY+6,String$("*",Min(Len(TEX$),WX))+Space$(Max(0,Min(WX,MC)-Len(TEX$)))
Else
Text TX,TY+6,Left$(TEX$,Min(Len(TEX$),WX))+Space$(Max(0,Min(WX,MC)-Len(TEX$)))
End If
Sprite Off 2 : Wait Vbl
End Proc
Procedure BT[X1,Y1,X2,Y2,T$]
Ink 2 : Bar X1,Y1 To X2,Y2
Ink 1 : Draw X1,Y2-1 To X1,Y1
Draw X1,Y1 To X2-1,Y1
Ink 3 : Draw X1+1,Y2 To X2,Y2
Draw X2,Y1+1 To X2,Y2
X=X1+((X2-X1)-Len(T$)*8)/2
Y=Y1+(Y2-Y1)/2+3
Gr Writing 0
Ink 3,2 : Text X+2,Y+1,T$
Ink 1,2 : Text X+1,Y,T$
Gr Writing 1
End Proc
Procedure SETB[A,X1,Y1,X2,Y2,T$]
B(A,0)=X1 : B(A,1)=Y1 : B(A,2)=X2 : B(A,3)=Y2
Ink 2 : Bar X1,Y1 To X2,Y2
Ink 1 : Draw X1,Y2-1 To X1,Y1
Draw X1,Y1 To X2-1,Y1
Ink 3 : Draw X1+1,Y2 To X2,Y2
Draw X2,Y1+1 To X2,Y2
X=X1+((X2-X1)-Len(T$)*8)/2
Y=Y1+(Y2-Y1)/2+3
Gr Writing 0
Ink 3,2 : Text X+2,Y+1,T$
Ink 1,2 : Text X+1,Y,T$
Gr Writing 1
End Proc
Procedure TX[T$,X,Y]
If T$<>"" Then Ink 2 : Bar X,Y To X+Len(T$)*8,Y+8
Gr Writing 0
Ink 3,2 : Text X+1,Y+7,T$
Ink 1,2 : Text X,Y+6,T$
Gr Writing 1
End Proc
Procedure T[T$,Y]
Gr Writing 0
X=320-Len(T$)*4
Ink 3+C,2 : Text X+1,Y+7,T$
Ink 1+C,2 : Text X,Y+6,T$
Gr Writing 1
End Proc
Procedure B[X1,Y1,X2,Y2]
Ink 2 : Bar X1,Y1 To X2,Y2
Ink 1 : Draw X1,Y2-1 To X1,Y1
Draw X1,Y1 To X2-1,Y1
Ink 3 : Draw X1+1,Y2 To X2,Y2
Draw X2,Y1+1 To X2,Y2
End Proc
Procedure BE[X1,Y1,X2,Y2]
Ink 1 : Draw X1,Y2-1 To X1,Y1
Draw X1,Y1 To X2-1,Y1
Ink 3 : Draw X1+1,Y2 To X2,Y2
Draw X2,Y1+1 To X2,Y2
End Proc
Procedure PRESS[A]
Ink 3 : Draw B(A,0),B(A,3)-1 To B(A,0),B(A,1)
Draw B(A,0),B(A,1) To B(A,2)-1,B(A,1)
Ink 1 : Draw B(A,0)+1,B(A,3) To B(A,2),B(A,3)
Draw B(A,2),B(A,1)+1 To B(A,2),B(A,3)
B(A,4)=1
End Proc
Procedure REALISE[A]
Ink 1 : Draw B(A,0),B(A,3)-1 To B(A,0),B(A,1)
Draw B(A,0),B(A,1) To B(A,2)-1,B(A,1)
Ink 3 : Draw B(A,0)+1,B(A,3) To B(A,2),B(A,3)
Draw B(A,2),B(A,1)+1 To B(A,2),B(A,3)
B(A,4)=0
End Proc
Procedure PUSH[GOT$,STA,LE]
AD=Varptr(GOT$)-1
For A=1 To LE
B=Peek(AD+A) : If A>Len(GOT$) Then B=0
Poke STA+A-1,B
Next
End Proc
Procedure PULL[STA,LE]
A$=""
For A=0 To LE-1
B=Peek(STA+A) : Exit If B=0
A$=A$+Chr$(B)
Next
End Proc[A$]
Procedure ALERT[TITLE$,YES$,CANCEL$,NO$]
Get Cblock 1,80,50,480,50
BE[559,99,80,50]
Ink 0 : Box 81,51 To 558,98
B[82,52,557,97]
T[TITLE$,56]
BUT=3
If NO$="" Then Dec BUT
If CANCEL$="" Then Dec BUT
Restore(BUT)
T$=YES$
For A=58 To BUT+57
Read B(A,0),B(A,1),B(A,2),B(A,3)
If A=59 Then T$=CANCEL$
If A=60 Then T$=NO$
BT[B(A,0),B(A,1),B(A,2),B(A,3),T$]
Next
Repeat
B=0 : M=Mouse Key : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse) : AC=Asc(Inkey$)
Multi Wait
If M Then Gosub CHECKBUT
Until B
Add B,-58
Put Cblock 1
Goto SKIP
CHECKBUT:
B=0 : P=0
For A=58 To 57+BUT
If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) : B=A : Exit : End If
Next
If B=0 Then Return
Repeat
M=Mouse Key : X=(X Mouse-128)*2 : Y=Y Mouse-50 : A=0
If X>B(B,0) and Y>B(B,1) and X<B(B,2) and Y<B(B,3) Then A=1
If A=1 and P=0 Then P=1 : PRESS[B]
If A=0 and P=1 Then P=0 : REALISE[B]
Until M=0
If P=0 Then B=0 : Return
REALISE[B]
Return
1 Data 100,70,540,90
2 Data 100,70,315,90
Data 325,70,540,90
3 Data 100,70,240,90
Data 246,70,386,90
Data 392,70,540,90
SKIP:
End Proc[B]
Procedure SETUP[TITLE$]
Get Cblock 2,80,50,480,50
BE[559,99,80,50]
Ink 0 : Box 81,51 To 558,98
B[82,52,557,97]
T[TITLE$,56]
End Proc
Procedure SETMESS[TITLE$]
Ink 2 : Bar 83,66 To 556,96
T[TITLE$,76]
End Proc
Procedure SHUTUP
Put Cblock 2
End Proc
Procedure INBOX[TITLE$,YES$,NO$,LE,NUMS,MIZ,MAZ]
Get Cblock 1,80,50,480,50
BE[559,99,80,50]
Ink 0 : Box 81,51 To 558,98
B[82,52,557,97]
T[TITLE$,54]
BUT=2
If NO$="" Then Dec BUT
SETB[58,100,63,540,73,""]
Restore(BUT+3)
T$=YES$
For A=59 To BUT+58
Read B(A,0),B(A,1),B(A,2),B(A,3)
If A=60 Then T$=NO$
BT[B(A,0),B(A,1),B(A,2),B(A,3),T$]
Next
Repeat
EINGABE[102,65,54,LE,NUMS]
If NUMS and 1 Then TEX$=Str$(Max(Min(Val(TEX$),MAZ),MIZ))-" "
B=0 : M=Mouse Key : X=X Screen(X Mouse) : Y=Y Screen(Y Mouse) : AC=Asc(Inkey$)
Multi Wait
If M Then Gosub CHECKBUT
Until B>58 or RET=1
If RET Then B=59
Add B,-59
Put Cblock 1
Goto SKIP
CHECKBUT:
B=0 : P=0
For A=59 To 58+BUT
If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) : B=A : Exit : End If
Next
If B=0 Then Return
Repeat
M=Mouse Key : X=(X Mouse-128)*2 : Y=Y Mouse-50 : A=0
If X>B(B,0) and Y>B(B,1) and X<B(B,2) and Y<B(B,3) Then A=1
If A=1 and P=0 Then P=1 : PRESS[B]
If A=0 and P=1 Then P=0 : REALISE[B]
Until M=0
If P=0 Then B=0 : Return
REALISE[B]
Return
4 Data 100,75,540,95
5 Data 100,75,315,95
Data 325,75,540,95
SKIP:
End Proc[B]
'
DATS:
Data 2,13,142,23,"DATENBANK LADEN"
Data 144,13,284,23,"DATENBANK SICHERN"
Data 286,13,426,23,"DATENBANK L�SCHEN"
Data 428,13,637,23,"NEUE DATENBANK ANLEGEN"
Data 2,25,284,35,"DATENBANK VERSCHL�SSELN"
Data 286,25,426,35,"DATEI L�SCHEN"
Data 428,25,637,35,"AMOS-DATENBANK VERLASSEN!"
'
Data 482,40,502,80,""
Data 482,82,502,122,""
Data 504,40,637,50,"N�CHSTER EINTRAG"
Data 504,52,637,62,"VORHER. EINTRAG"
Data 504,64,637,74,"EINTRAG EINF�GEN"
Data 504,76,637,86,"EINTRAG L�SCHEN"
Data 504,88,637,98,"EINTRAG SUCHEN"
Data 504,100,637,110,"ALPHA. SORTIEREN"
Data 504,112,637,122,"SATZDATEN �NDERN"
'
Data 482,127,637,137,"EINTRAG DRUCKEN"
Data 482,139,637,149,"EINTRAG SICHERN"
Data 482,151,637,161,"SERIENBRIEF LADEN"
Data 482,163,637,173,"SERIENBRIEF SICHERN"
Data 482,175,637,185,"SERIENBRIEF ZEIGEN"
Data 482,187,637,197,"SERIENBRIEF DRUCKEN"